#pragma once
// 字典类型
#include <iostream>
#include <string>
#include <unordered_map>
#include <fstream>
using namespace std;

namespace Dict_ns
{
    const string defaultpath = "./Dict.txt";
    const string sep = "："; // 字典中的分隔符
    class Dict
    {
    private:
        // 录入配置文件
        bool Load()
        {
            ifstream in(_dict_conf_filepath); // 打开配置文件
            if (in.is_open() == false)        // 查看该文件是否被打开
            {
                cout << "打开配置文件失败" << endl;
                return false;
            }
            string line; // 读取缓冲区
            // 从in文件流中读取信息到line缓冲区中
            while (getline(in, line))
            {
                // 如果缓冲区中读取到的信息是空的，就跳过，读取下一个
                if (line.empty() == true)
                {
                    continue;
                }
                int pos = line.find(sep); // 在line缓冲区中查找分隔符所处的下标
                if (pos == string::npos)  // 如果没有查到下标，就跳过此行
                {
                    cout << "此行信息是非法的" << endl;
                    continue;
                }
                string word = line.substr(0, pos); // 提取单词
                if (word.empty())                  // 单词空则跳过
                {
                    continue;
                }
                string han = line.substr(pos + sep.size(), line.size()); // 提取翻译
                if (han.empty())
                {
                    continue;
                }
                // 插入到字典容器中
                cout << "加载字典信息" << word << ":" << han << endl;
                _dict.insert(make_pair(word, han));
            }
            cout << "加载字典信息结束" << endl;
            in.close();
            return true;
        }

    public:
        Dict(const string &path = defaultpath)
            : _dict_conf_filepath(path)
        {
            // 将配置文件的信息插入到字典容器中
            Load();
        }
        ~Dict()
        {
        }
        // 翻译
        string Translate(const string &word, bool &ok)
        {
            ok = true;
            auto iter = _dict.find(word);
            if (iter == _dict.end())
            {
                ok = false;
                cout << "未找到此单词的翻译结果" << endl;
            }
            if (ok == true)
            {
                return iter->second;
            }
            else
            {
                return "未找到此单词的翻译结果";
            }
        }

    private:
        unordered_map<string, string> _dict; // 字典容器
        string _dict_conf_filepath;          // 字典配置文件
    };
}